package global

import (
	"gitee.com/baal1990/epidemic/utils/crypto"
	"gitee.com/baal1990/epidemic/utils/msgcode"
	"sync"

	"gitee.com/baal1990/epidemic/utils/timer"
	"github.com/songzhibin97/gkit/cache/local_cache"

	"golang.org/x/sync/singleflight"

	"go.uber.org/zap"

	"gitee.com/baal1990/epidemic/config"

	"github.com/go-redis/redis/v8"
	"github.com/spf13/viper"
	"gorm.io/gorm"
)

var (
	GVA_DB     *gorm.DB
	GVA_DBList map[string]*gorm.DB
	GVA_REDIS  *redis.Client
	GVA_CONFIG config.Server
	GVA_VP     *viper.Viper
	// GVA_LOG    *oplogging.Logger
	GVA_LOG                 *zap.Logger
	GVA_Timer               = timer.NewTimerTask()
	GVA_Concurrency_Control = &singleflight.Group{}

	BlackCache       local_cache.Cache
	lock             sync.RWMutex
	AsymmetricCrypto crypto.AsymmetricCrypto // 非对称加密工具
	SymmetricCrypto  crypto.SymmetricCrypto  // 对称加密工具
	Rc4Crypto        crypto.Rc4Crypto        // RC4对称加密工具
	MsgCodeGenerator = &msgcode.Redis{}      // 验证码生成器
)

// GetGlobalDBByDBName 通过名称获取db list中的db
func GetGlobalDBByDBName(dbname string) *gorm.DB {
	lock.RLock()
	defer lock.RUnlock()
	return GVA_DBList[dbname]
}

// MustGetGlobalDBByDBName 通过名称获取db 如果不存在则panic
func MustGetGlobalDBByDBName(dbname string) *gorm.DB {
	lock.RLock()
	defer lock.RUnlock()
	db, ok := GVA_DBList[dbname]
	if !ok || db == nil {
		panic("db no init")
	}
	return db
}
